package otc.regate.client;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Classe generant le fichier d'envoie au format GPX.
 *
 * @author Escop, Jacquet, Loiret, Marboeuf, Millet, Montferrand
 *
 */
public class ThreadClient extends Thread {

    /** Le participant. */
    private Client client;
    /** Identifiant du participant. */
    private int idParticipant;
    /** Nom de la course. */
    private String nomCourse;
    /** Coordonnees du participant. */
    private Coordonnees coordonnees;
    /** Force du vent de la zone. */
    private double forceVent;
    /** Numero du derniere passage. */
    private int numeroDernierPassage;
    /** Indiquateur de la fin de la course. */
    private boolean courseFini;

    /**
     * Constructeur.
     *
     * @param cl client
     * @param idPa idParticipant
     * @param nomCo nomCourse
     * @throws IOException IoException
     */
    public ThreadClient(final Client cl, final int idPa, final String nomCo)
        throws IOException {

        this.client = cl;
        this.idParticipant = idPa;
        this.nomCourse = nomCo;
        System.out.println("Connexion avec le serveur");

        //Initialisation du point de passage
        numeroDernierPassage = 0;

        // Initialisation des coordonnees
        coordonnees = new Coordonnees(0, 0);

    }

    /**
     * Methode executee par le thread.
     *
     */
    public final void run() {

        try {

            //On attend le message du serveur pour demarrer
            ObjectInputStream inputStream = new ObjectInputStream(
                   this.client.getSocketClient().getInputStream());

            courseFini = false;

            while (!courseFini) {

                // Recuperer la force du vent
                forceVent = Utilitaire.tableauVent
                [(int) coordonnees.getLatitude()]
                 [(int) coordonnees.getLongitude()];

                // Appel de la methode de la classe utilitaire pour
                // les nouvelles coordonnees
                coordonnees = Utilitaire.avancement(coordonnees,
                        Utilitaire.pointsDePassage.
                        get(numeroDernierPassage + 1),
                        forceVent);

                Date actuelle = new Date();
                DateFormat dateFormat =
                    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String date = dateFormat.format(actuelle);

                String contenuXML = "<gpx version=\"1.1\" " +
                		"creator=\"xsd:string\">";
                contenuXML += "<rte><rtept lat=\" " +
                 coordonnees.getLatitude() +
                " \" lon=\" " + coordonnees.getLongitude() + " \"/></rte>";
                contenuXML += "<extensions>";
                contenuXML += "<desc>" + nomCourse + "</desc>";
                contenuXML += "<author>";
                contenuXML += "<id>" + idParticipant + "</id>";
                contenuXML += "</author>";
                contenuXML += "<time>" + date + "</time>";
                contenuXML += "</extensions>";
                contenuXML += "</gpx>";

                client.envoieXML(contenuXML);
                // Envoie des informations toutes les cinq secondes
                sleep(4000);

                //On calcule la distance entre ses coordonnees et le prochain
                //point de passage.
                //On passe au point de passage suivant si il est a moins de 1
                //de distance

                if (Utilitaire.calculDistance(coordonnees,
                        Utilitaire.pointsDePassage.get(numeroDernierPassage+1))
                        < Utilitaire.distanceBaliseAccordee){
                    numeroDernierPassage++;
                }
                if (numeroDernierPassage >=
                            Utilitaire.pointsDePassage.size()-1){
                    courseFini = true;
                }
            }
        } catch (Exception e){}
    }
}
